/* 
 * GDT ir IDT lentelių aprašai
 */
#ifndef DESCR_TABLES_H
#define DESCR_TABLES_H
/*--------------*/
/*--Struktūros--*/
/*--------------*/
/* GDT lentelės vienos įeities struktūra */
struct gdt_entry{
  u16int limit_low;    /* Žemesnieji 16 bitų limito */
  u16int base_low;     /* Žemesnieji 16 bitų bazės */
  u8int  base_middle;  /* Vidurinieji 8 bitai bazės */
  u8int  access;       /* Priėjimo vėliavos, nusakančios kuriame žiede galima naudoti segmentą */
  u8int  granularity;  /* Nusako kokiame blocke (1 baito ar 4kBaitų) yra limitas */
  u8int  base_high;    /* Paskutinieji 8 bitai bazės */
} __attribute__((packed)); /* Kad nebūtų keičiamiami vietomis struktūros elementai */

/* Kad procesorius žinotų, kur randasi GDT lentelė, sukuriama rodyklė. Panaudoti LGDT */
struct gdt_pointer{
  u16int limit;  /* Aukštesnieji 16 bitų limito(lentelės dydis -1) */
  u32int base;   /* Adresas pirmosios įeities */
} __attribute__((packed)); /* Kad nebūtų keičiamiami vietomis struktūros elementai */

/* IDT lentelės vienos įeities struktūra */
struct idt_entry{
  u16int base_lo;  /* Žemesniejo 16 bitų adreso į kurį reikia šokti kai įvyksta šis pertraukimas */
  u16int sel;      /* Kernelio segmento selectorius */
  u8int  always0;  /* Tai turi būti visda nulis (0) */
  u8int  flags;    /* Kelios vėliavos */
  u16int base_hi;  /* Aukštesnieji 16 bitų adreso į kurį reikia daryti šuolį */
} __attribute__((packed)); /* Kad nebūtų keičiamiami vietomis struktūros elementai */

/* Kad procesorius žinotų, kur randasi IDT lentelė, sukuriama rodyklė. Panaudoti LIDT */
struct idt_pointer{
  u16int limit;  /* Aukštesnieji 16 bitų limito(lentelės dydis -1) */
  u32int base;   /* Adresas pirmosios įeities */                
} __attribute__((packed)); /* Kad nebūtų keičiamiami vietomis struktūros elementai */
/*--------------*/
/*--Kintamieji--*/
/*--------------*/
typedef struct gdt_entry gdt_entry_t;
typedef struct gdt_pointer gdt_ptr_t;
typedef struct idt_entry idt_entry_t;
typedef struct idt_pointer idt_ptr_t;
/*---------------------*/
/*--Fukcijų antraštės--*/
/*---------------------*/
boolean init_descriptor_tables(); /* GDT ir IDT lentelių inicijavimo funkcija */
/* Funkcijų antraštės, kurios leis C kode kviesti asemblerio funkcijas */
/* Šios funkcijos skirtos valdyti pertraukimams */
extern void isr0();  /* Division by zero exception */
extern void isr1();  /* Debug exception */
extern void isr2();  /* Non maskable interrupt */
extern void isr3();  /* Breakpoint exception */
extern void isr4();  /* 'Into detected overflow' */
extern void isr5();  /* Out of bounds exception */
extern void isr6();  /* Invalid opcode exception */
extern void isr7();  /* No coprocessor exception */
extern void isr8();  /* Double fault (pushes an error code) */
extern void isr9();  /* Coprocessor segment overrun */
extern void isr10(); /* Bad TSS (pushes an error code) */
extern void isr11(); /* Segment not present (pushes an error code) */
extern void isr12(); /* Stack fault (pushes an error code) */
extern void isr13(); /* General protection fault (pushes an error code) */
extern void isr14(); /* Page fault (pushes an error code) */
extern void isr15(); /* Unknown interrupt exception */
extern void isr16(); /* Coprocessor fault */
extern void isr17(); /* Alignment check exception */
extern void isr18(); /* Machine check exception */                        
extern void isr19(); /* Like yra rezervuoti iki 31 imtinai */
extern void isr20();
extern void isr21();
extern void isr22();
extern void isr23();
extern void isr24();
extern void isr25();
extern void isr26();
extern void isr27();
extern void isr28();
extern void isr29();
extern void isr30();
extern void isr31();
extern void irq0();
extern void irq1();
extern void irq2();
extern void irq3();
extern void irq4();
extern void irq5();
extern void irq6();
extern void irq7();
extern void irq8();
extern void irq9();
extern void irq10();
extern void irq11();
extern void irq12();
extern void irq13();
extern void irq14();
extern void irq15();

#endif /* DESCR_TABLES_H */
